package com.bankLogisticsSys.util;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.Map;

import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFFont;
import org.apache.poi.hssf.usermodel.HSSFRichTextString;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.hssf.util.HSSFColor;
import org.apache.poi.ss.usermodel.HorizontalAlignment;
import org.apache.poi.ss.usermodel.VerticalAlignment;
import org.apache.poi.ss.util.CellRangeAddress;

import com.jfinal.kit.PathKit;
import com.jfinal.plugin.activerecord.Record;

public class ExcelExportUtil {

    private static final String FILEPATH = PathKit.getWebRootPath() + File.separator + "upload" + File.separator ;

    public static String getTitle(){
        Date date = new Date();
        SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd");  
         String title=dateFormat.format(date)+"_统计报表.xls";  
         return title;
    }
    
    public static String getMonthReportTitle(int month, String bank){
//         String title=bank + month + "月度统计报表.xls";  
         String title = "交通银行" + month + "月统计报表.xls";  
         return title;
    }
    
    
    public static File saveMonthReport(Map<String, String> titleData, int year, int month,int startDay,int endDay, List<Record> dataList,List<Record> dataList2, File file) {
        // 创建工作薄
        HSSFWorkbook hssfWorkbook = new HSSFWorkbook();
        // sheet:一张表的简称
        // row:表里的行
        // 创建工作薄中的工作表
        HSSFSheet hssfSheet = hssfWorkbook.createSheet();
        // 创建行
        HSSFRow row = hssfSheet.createRow(0);
        // 创建单元格，设置表头 创建列
        HSSFCell cell = null;
        // 初始化索引
        int rowIndex = 0;
        int cellIndex = 0;
        //////////////////////////////////////////////////////////////////test month
        int days = endDay - startDay + 1;
        int columnNum = days*2 + 1;

        //        hssfSheet.createFreezePane(1, 3);// 冻结    
        
        // 设置列宽    
        hssfSheet.setColumnWidth(0, 6500);
        for(int i=1;i<columnNum;i++){
        	hssfSheet.setColumnWidth(i, 3000);
        }
        
        //设置小标题样式
        HSSFCellStyle headstyle = hssfWorkbook.createCellStyle();
        headstyle.setAlignment(HorizontalAlignment.CENTER);//左右居中
        headstyle.setVerticalAlignment(VerticalAlignment.CENTER);// 上下居中    
        headstyle.setLocked(true);    
        headstyle.setWrapText(true);// 自动换行
        
        //设置大标题样式
        HSSFCellStyle titlestyle = hssfWorkbook.createCellStyle();
        titlestyle.setVerticalAlignment(VerticalAlignment.CENTER);// 上下居中    
        titlestyle.setLocked(true);    
        titlestyle.setWrapText(true);// 自动换行
        
        //设置高亮标题,字体，样式
        HSSFFont font=hssfWorkbook.createFont();
        font.setColor(HSSFColor.RED.index);//HSSFColor.VIOLET.index //字体颜色
        font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);         //字体增粗
       //把字体应用到当前的样式
        HSSFCellStyle highlightstyle = hssfWorkbook.createCellStyle();
        highlightstyle.setVerticalAlignment(VerticalAlignment.CENTER);// 上下居中    
        highlightstyle.setLocked(true);
        highlightstyle.setFont(font);
        highlightstyle.setWrapText(true);// 自动换行
        
        /* 创建总标题   */ 
        HSSFRow row0 = hssfSheet.createRow(rowIndex++);    
        // 设置行高    
        row0.setHeight((short) 500);    
        // 创建第一列    
        HSSFCell cell0 = row0.createCell(cellIndex);
        cell0.setCellStyle(titlestyle);
        cell0.setCellValue(new HSSFRichTextString("                            上行包每日明细表"));    
        
        //合并单元格---总标题栏
        CellRangeAddress region = new CellRangeAddress(0, 0, 0, days*2);
        hssfSheet.addMergedRegion(region);
        
        /* 创建标题行 */
        HSSFRow row1 = hssfSheet.createRow(rowIndex++);
        HSSFRow row2 = hssfSheet.createRow(rowIndex++);
        cell = row1.createCell(cellIndex++);
        cell.setCellStyle(headstyle);
        cell.setCellValue("银行网点");

        
        //合并单元格---银行网点
        CellRangeAddress region2 = new CellRangeAddress(1, 2, 0, 0);
        hssfSheet.addMergedRegion(region2);
        //合并单元格---日期,并添加日期标题及包裹标题
        for(int i=0,j=startDay;j<=endDay;i++,j++){
        	cell = row1.createCell(i*2+1);
        	cell.setCellStyle(headstyle);
        	cell.setCellValue(month + "月" + j + "日");
        	cell = row2.createCell(i*2 +1);
        	cell.setCellStyle(headstyle);
        	cell.setCellValue("大包数");
        	cell = row2.createCell(i*2 +2);
        	cell.setCellStyle(headstyle);
        	cell.setCellValue("小包数");
        	CellRangeAddress region3 = new CellRangeAddress(1, 1, i*2+1, i*2+2);
        	hssfSheet.addMergedRegion(region3);
        }
        

        // 得到所有记录 行：列
        List<Record> list = dataList;
        Record record = null;

        if (list != null) {
            // 获取所有的记录 有多少条记录就创建多少行
            for (int i = 0; i < list.size(); i++) {
                row = hssfSheet.createRow(rowIndex);
                // 得到所有的行 一个record就代表 一行
                record = list.get(i);
                //下一行索引
                rowIndex++;
                //刷新新行索引
                cellIndex = 0;
                cell = row.createCell(cellIndex++);
                cell.setCellValue(record.get("network") == null? "null": record.get("network").toString());
                // 在有所有的记录基础之上，便利传入进来的表头,再创建N行
                for (int j=startDay;j<=endDay;j++) {
                    cell = row.createCell(cellIndex);
                    cellIndex++;
                    //按照每条记录匹配数据
                    cell.setCellValue(record.get("bigPackage"+j) == null ? "0" : record.get("bigPackage"+j).toString());
                    cell = row.createCell(cellIndex++);
                    cell.setCellValue(record.get("smallPackage"+j) == null ? "0" : record.get("smallPackage"+j).toString());    
                }
            }
        }
        
        /*汇总数据录入，封包，揽收，接受，验收 */
        // 创建标题行
        row = hssfSheet.createRow(rowIndex+3);
        rowIndex += 4;
        cellIndex = 0;
        // 遍历标题
        for (String h : titleData.keySet()) {
            //创建列
            cell = row.createCell(cellIndex);
            //索引递增
            cellIndex++;
            //逐列插入标题
            cell.setCellValue(titleData.get(h));
        }

        // 得到所有记录 行：列
        List<Record> list2 = dataList2;
        Record record2 = null;

        if (list != null) {
            // 获取所有的记录 有多少条记录就创建多少行
            for (int i = 0; i < list2.size(); i++) {
                row = hssfSheet.createRow(rowIndex);
                // 得到所有的行 一个record就代表 一行
                record2 = list2.get(i);
                //下一行索引
                rowIndex++;
                //刷新新行索引
                cellIndex = 0;
                // 在有所有的记录基础之上，便利传入进来的表头,再创建N行
                for (String h : titleData.keySet()) {
                    cell = row.createCell(cellIndex);
                    cellIndex++;
                    //按照每条记录匹配数据,并标红数据不一致的项
                    if(h.equals("get") && !record2.get(h).equals(record2.get("receive"))){
                    	cell.setCellStyle(highlightstyle);                    	
                    }
                    if(h.equals("pack") && !record2.get(h).equals(record2.get("accept"))){
                    	cell.setCellStyle(highlightstyle);                    	
                    }
                    cell.setCellValue(record2.get(h) == null ? "" : record2.get(h).toString());
                }
            }
        }
        
        try {
            FileOutputStream fileOutputStreane = new FileOutputStream(file);
            hssfWorkbook.write(fileOutputStreane);
            fileOutputStreane.flush();
            fileOutputStreane.close();
            
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return file;
    }
    
    //月度报表的创建---这里先存着之前的函数，等下再做修改
    public static File saveFile(Map<String, String> headData, List<Record> dataList, File file) {
        // 创建工作薄
        HSSFWorkbook hssfWorkbook = new HSSFWorkbook();
        // sheet:一张表的简称
        // row:表里的行
        // 创建工作薄中的工作表
        HSSFSheet hssfSheet = hssfWorkbook.createSheet();
        // 创建行
        HSSFRow row = hssfSheet.createRow(0);
        // 创建单元格，设置表头 创建列
        HSSFCell cell = null;
        // 初始化索引
        int rowIndex = 0;
        int cellIndex = 0;

        // 创建标题行
        row = hssfSheet.createRow(rowIndex);
        rowIndex++;
        // 遍历标题
        for (String h : headData.keySet()) {
            //创建列
            cell = row.createCell(cellIndex);
            //索引递增
            cellIndex++;
            //逐列插入标题
            cell.setCellValue(headData.get(h));
        }

        // 得到所有记录 行：列
        List<Record> list = dataList;
        Record record = null;

        if (list != null) {
            // 获取所有的记录 有多少条记录就创建多少行
            for (int i = 0; i < list.size(); i++) {
                row = hssfSheet.createRow(rowIndex);
                // 得到所有的行 一个record就代表 一行
                record = list.get(i);
                //下一行索引
                rowIndex++;
                //刷新新行索引
                cellIndex = 0;
                // 在有所有的记录基础之上，便利传入进来的表头,再创建N行
                for (String h : headData.keySet()) {
                    cell = row.createCell(cellIndex);
                    cellIndex++;
                    //按照每条记录匹配数据
                    cell.setCellValue(record.get(h) == null ? "" : record.get(h).toString());
                }
            }
        }
        try {
            FileOutputStream fileOutputStreane = new FileOutputStream(file);
            hssfWorkbook.write(fileOutputStreane);
            fileOutputStreane.flush();
            fileOutputStreane.close();
            
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return file;
    }
    
    public static int getMonthLastDay(int year, int month)  
    {  
        Calendar a = Calendar.getInstance();  
        a.set(Calendar.YEAR, year);  
        a.set(Calendar.MONTH, month - 1);  
        a.set(Calendar.DATE, 1);//把日期设置为当月第一天  
        a.roll(Calendar.DATE, -1);//日期回滚一天，也就是最后一天  
        int maxDate = a.get(Calendar.DATE);  
        return maxDate;  
    }  
}